from __future__ import division
import sys,os,time
from src.Equipments.LockIn import SR830
from src.Equipments.RFGenerator import E8257D
from src.Equipments.multimeter import AgilentMulti
from src.Equipments.gaussmeter import Lakeshore455

from src.Data.DataStructure import Data

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

User="PierreAndre"
#import pylab as plb
home_path=os.getcwd()+os.sep#Current path to this program
sys.path.append(home_path+"src"+os.sep)
data_path=home_path+"Users"+os.sep+User+os.sep+"data"+os.sep#For saving later on data
#print data_path

#########################################################
### Parameters - Sweeping settings
#########################################################
fstart=8141-80 #MHz
fstop=8141+80 #MHz
number_of_points=200 #Total number of points
waiting_time=1000	#ms, Waiting time for each point
test=False #If standalone without anything connected->True
#########################################################
#########################################################


#########################################################
### Parameters - Multimeter
#########################################################
multi=AgilentMulti("GPIB0::13::INSTR",test)
#########################################################
#########################################################

#########################################################
### Parameters - Lockin
#########################################################
lockin=SR830("GPIB0::9::INSTR",test)
lockin.Set_Measure_Rate(512) #Hz
#lockin.Set_LPF(12)#dB/oct
#lockin.Set_Sensitivity(1) #V
#lockin.Set_Time_Constant(0.3)
lockin.Set_Harm(2)
lockin.Set_InterExter_Mode(0)
#########################################################
### Parameters - Gaussmeter
#########################################################
gaussmeter=Lakeshore455("GPIB0::12::INSTR",test)
#########################################################
#########################################################

#########################################################
### Parameters - RF setup
#########################################################
RF=E8257D("GPIB0::10::INSTR","AM",test)
RF.Set_Modulation(51,30)	#Frequency kHz, Modulation deviation MHz / amplitude dB
RF.Set_Modulation_Output(True,True)	#Modulation On = True, LFOutput On = True
RF.Set_Power(3)	#dBm
RF.Set_Output_ONOFF(True)
frequency = fstart
RF.Set_Frequency(frequency)#MHz
fstep = (fstop-fstart)/(number_of_points-1)
#########################################################
#########################################################


#########################################################
### Parameters - Data saving
#########################################################
data=Data(given_name="natSiBi-SDR-650Cvac-1_20-Tdep",
		path=data_path,
		comments="",
		rows=number_of_points,
		columns=4,#Field, A1 and A2 channel
		light=True,
		temperature=12.5,#K
		scan_mode="frequency",
		phase=0,#in degree
		modulation_frequency=51,#in kHz
		modulation_amplitude=500,#in mT / kHz
		receiver_mode=2,
		receiver_gain=1,
		time_constant=0.3, #in s
		field=30,#mT 
		power=100,#mW
		picture_saving_format='eps',
		user=User)
data.step=0 #Initial value
#########################################################
#########################################################

#########################################################
### Measure
#########################################################
def DoMeasure(arg):
	global frequency
	
	ti=time.time()
	if data.step <= number_of_points-1:
		data.data[data.step,0]=frequency
		X,Y=lockin.Read_XY()
		data.data[data.step,1]=X
		data.data[data.step,2]=Y

		
		data.data[data.step,3]=gaussmeter.Measure_Field()
		print "f = ",data.data[data.step,0]," MHz, A1 = ",data.data[data.step,1]," V, A2 = ",data.data[data.step,2]," V, B0 = ",data.data[data.step,3]," mT"
		
		#set new frequency
		frequency+=fstep
		data.step+=1
		
		RF.Set_Frequency(frequency)
		
	elif data.step == number_of_points-1:
		data.data[data.step,0]=frequency
		X,Y=lockin.Read_XY()
		data.data[data.step,1]=X
		data.data[data.step,2]=Y

		
		data.data[data.step,3]=gaussmeter.Measure_Field()
		print "f = ",data.data[data.step,0]," MHz, A1 = ",data.data[data.step,1]," V, A2 = ",data.data[data.step,2]," V, B0 = ",data.data[data.step,3]," mT"
		
		data.Save_data()
		#has to be after data.Save_data because that method fill the self.full_saving_path value
		plt.savefig(data.full_saving_path+'.'+data.picture_saving_format,format=data.picture_saving_format)
		data.step+=1
		print "Complete."
	else:
		pass
	DoTime=time.time()-ti
	if waiting_time-DoTime*1000<=0:
		DeltaTDo=waiting_time
	else:
		DeltaTDo=waiting_time-DoTime*1000
	TimerDo.interval=DeltaTDo
#########################################################
#########################################################


#########################################################
### Plotting
#########################################################
fig = plt.figure(1)

gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])
ax1.grid(True)
ax1.set_title("Frequency sweep")
ax1.set_ylabel("SDR signal (V)")
ax1.axis([0,1,0,1])
ax2.grid(True)
ax2.set_xlabel("Frequency (MHz)")
ax2.set_ylabel("SDR signal (V)")
ax2.axis([0,1,0,1])
line1=ax1.plot([0,1],[0,1],'o-k')
line2=ax2.plot([0,1],[0,1],'o-r')
manager = plt.get_current_fig_manager()

def RealtimePloter(arg):
	global values
	ti=time.time()
	if data.step>0:
		line1[0].set_data(data.data[0:data.step,0],data.data[0:data.step,1])
		ax1.axis([data.data[0:data.step,0].min(),data.data[0:data.step,0].max(),data.data[0:data.step,1].min(),data.data[0:data.step,1].max()])
		line2[0].set_data(data.data[0:data.step,0],data.data[0:data.step,2])
		ax2.axis([data.data[0:data.step,0].min(),data.data[0:data.step,0].max(),data.data[0:data.step,2].min(),data.data[0:data.step,2].max()])
		manager.canvas.draw()
	PlotTime=time.time()-ti
	if waiting_time-PlotTime*1000<=0:
		DeltaTPlot=waiting_time
	else:
		DeltaTPlot=waiting_time-PlotTime*1000
	TimerPlot.interval=DeltaTPlot
	#manager.show()

lockin.Reset_Memory()

TimerPlot = fig.canvas.new_timer(interval=waiting_time)
TimerPlot.add_callback(RealtimePloter, ())
TimerDo = fig.canvas.new_timer(interval=waiting_time)
TimerDo.add_callback(DoMeasure, ())
TimerPlot.start()
TimerDo.start()

plt.show()
#########################################################
#########################################################